home *** CD-ROM | disk | FTP | other *** search
/ Alles Voor Internet / Tout Pour Internet / alles voor internet.iso / MacInternet™ / Net / Utilities / Seer family 2.0 / sr_prg.src / sp_event_loop.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-08-29  |  5.7 KB  |  256 lines  |  [TEXT/KAHL]

  1. /*
  2.     event loop
  3. */
  4.  
  5. #include "sp.h"
  6. #include "sc_event.h"
  7. #include "sp_menu.h"
  8.  
  9. /*
  10.     something was done that will cause the menus to need updating
  11. */
  12. void bad_menu(void);
  13. void bad_menu()
  14. {menu_ok=FALSE;
  15. }
  16.  
  17. void fix_menu(void);
  18. void fix_menu()
  19. {WindowPeek xFrontWindow;
  20.  int edit_on;
  21.  edit_on=TRUE;                /*assume edit menu should be on*/
  22.  menu_ok=TRUE;                /*we fill fix the menus now*/
  23.  xFrontWindow=(WindowPeek)FrontWindow();    /*get the front window*/
  24.  if(xFrontWindow==NIL)        /*is there a front window?*/
  25.   edit_on=FALSE;            /*no, so we can't edit it*/
  26.  else
  27.   if(xFrontWindow->windowKind >= 0) /*is there a desk accessory?*/
  28.     edit_on=FALSE;            /*it is ok to edit that*/
  29.  
  30.  if(edit_on) {
  31.    EnableItem(menu_handles[MENU_edit],0);    /*enable the edit menu*/
  32.    EnableItem(menu_handles[MENU_file],FILE_close);
  33.    }
  34.  else {
  35.    DisableItem(menu_handles[MENU_edit],0);    /*disable the edit menu*/
  36.    DisableItem(menu_handles[MENU_file],FILE_close);
  37.    }
  38.  
  39.  DisableItem(menu_handles[MENU_file],FILE_new);
  40.  DisableItem(menu_handles[MENU_file],FILE_open);
  41.  
  42.  DrawMenuBar();
  43. }
  44.  
  45.  
  46. /*
  47.     start up a desk accessory
  48. */
  49. void do_deskacc(int);
  50. void do_deskacc(item)
  51. int item;
  52. {GrafPtr savedPort;
  53.  Str255 desk_acc_name;
  54.  int temp;
  55.  
  56.  GetPort(&savedPort);
  57.  bad_menu();
  58.  
  59.  /*find the name of desk accessory*/
  60.  GetItem(menu_handles[MENU_apple],item,&desk_acc_name);
  61.  temp = OpenDeskAcc(desk_acc_name);            /*open the desk accessory*/
  62.  
  63.  SetPort(&savedPort);
  64. }
  65.  
  66. /*
  67.     select an item from the apple menu
  68. */
  69. void do_apple_cmd(int);
  70. void do_apple_cmd(item)
  71. int item;
  72. {if(item==APPLE_about){
  73.    doabout();
  74. #ifdef xxxyyy
  75.    UnloadSeg(&doabout);
  76. #endif
  77.    }
  78.  else
  79.    do_deskacc(item);
  80. }
  81.  
  82. void do_file_cmd(int);
  83. void do_file_cmd(fitem)
  84. int fitem;
  85. {register WindowPeek xFrontWindow;
  86.  xFrontWindow = (WindowPeek)FrontWindow();    /*see what the front window is*/
  87.  switch(fitem) {
  88.  case FILE_new:
  89.      break;
  90.  case FILE_open: 
  91.      break;
  92.  case FILE_close: {
  93.     if(xFrontWindow==NIL)                    /*if have a front window*/
  94.      break;
  95.     if(xFrontWindow->windowKind >= 0)        /*and it is a desk acc*/
  96.      break;
  97.     CloseDeskAcc(xFrontWindow->windowKind);
  98.     bad_menu();
  99.     }
  100.     break;
  101.  case FILE_quit: 
  102.     want_done=TRUE;                /*say we want to quit*/
  103.     break;
  104.  }
  105. }
  106.  
  107. void do_edit_cmd(int);
  108. void do_edit_cmd(e_item)
  109. int e_item;
  110. {if(SystemEdit(e_item-1))        /*edit a system window?*/
  111.    return;                        /*yes, fine SystemEdit did the work*/
  112. }
  113.  
  114. void do_cmd(uint32);
  115. void do_cmd(a_cmd)
  116. uint32 a_cmd;
  117. {register uint16 a_menu,a_menu_item;
  118.  a_menu=HiWord(a_cmd);            /*see which menu*/
  119.  if(a_menu==0)
  120.    return;
  121.   
  122.  a_menu -= gl.res_base;            /*adjust to zero based indexing*/
  123.  a_menu_item=LoWord(a_cmd);        /*get the menu index*/
  124.  switch(a_menu) {
  125.   case MENU_apple:                /*about, desk accessories*/
  126.     do_apple_cmd(a_menu_item);
  127.     break;
  128.   case MENU_file :                 /*file commands, open, close, quit etc*/
  129.     do_file_cmd(a_menu_item);
  130.     break;
  131.   case MENU_edit : 
  132.     do_edit_cmd(a_menu_item);    /*edit commands, cut, paste etc*/
  133.     break;
  134.   case MENU_seer :
  135.     do_seer_menu(a_menu_item);    /*the seer menu*/
  136.       break;
  137.   }
  138.  HiliteMenu(0);                    /*unhighlight the selected menu*/
  139. }
  140.  
  141. /*handle a key down event*/
  142. void e_key_down(EventRecord *);
  143. void e_key_down(the_event)
  144. EventRecord *the_event;
  145. {char char_in;
  146.  /*get character typed in*/
  147.  char_in = the_event->message & charCodeMask;
  148.  /*want to do a menu command?*/
  149.  if((the_event->modifiers & cmdKey) != 0)
  150.      do_cmd(MenuKey(char_in));        /*yes, menu command via command and key*/
  151. }
  152.  
  153.  
  154. /*handle a mouse down event*/
  155. void e_mouse_down (EventRecord *);
  156. void e_mouse_down (the_event)
  157. EventRecord *the_event;
  158. {WindowPtr the_window;
  159.  /*set the_window to the WindowPtr for where mouse event was*/
  160.  switch(FindWindow(the_event->where,&the_window)) {
  161.  case inDesk:             /*mouse down on desktop*/
  162.     break;
  163.       
  164.  case inMenuBar:          /*pulling down a menu*/
  165.     do_cmd(MenuSelect(the_event->where));
  166.     break;
  167.     
  168.  case inSysWindow :      /*click in a desk accessory*/
  169.     SystemClick(the_event,the_window);
  170.     bad_menu();
  171.     break;
  172.  
  173.  case inContent:        /*mouse down in a window*/
  174.      if(the_window!=FrontWindow())
  175.         SelectWindow(the_window);
  176.     else
  177.         e_down_content(the_event);
  178.     break;
  179.  
  180.  case inDrag:            /*in title bar for dragging*/
  181.     DragWindow(the_window,the_event->where,&dragRect);
  182.     break;
  183.       
  184.  case inGrow:            /*in grow box for resizing*/
  185.     e_grow(the_event->where);
  186.     break;
  187.       
  188.  case inGoAway:            /*in goaway for closing*/
  189.     if (TrackGoAway(the_window,the_event->where))
  190.         want_done=TRUE;                /*say we want to quit*/
  191.     break;
  192.       
  193.  case inZoomIn:            /*shrink to normal size*/
  194.     break;
  195.        
  196.  case inZoomOut:        /*expand window to full size*/
  197.     break;
  198.  }
  199. }
  200.  
  201. /*an event has come in, process it*/
  202. void do_event(EventRecord *);
  203. void do_event(the_event)
  204. register EventRecord *the_event;
  205. {switch(the_event->what) {
  206.  case mouseDown:
  207.     e_mouse_down(the_event);
  208.     break;
  209.  case mouseUp:
  210.     break;
  211.  case autoKey:
  212.  case keyDown:
  213.     e_key_down(the_event);
  214.     break;
  215.  case keyUp:
  216.     break;
  217.  case updateEvt:
  218.     e_update_event(the_event);
  219.     break;
  220.  case diskEvt:
  221.     break;
  222.  case activateEvt:
  223.      bad_menu();
  224.     if((((WindowPeek)the_event->message)->windowKind)!=gl.win_ref_num)
  225.       break;            /*don't care about da windows*/
  226.     if(the_event->modifiers & activeFlag)    /*activate?*/
  227.         e_activate((WindowPtr)the_event->message);
  228.     else
  229.         e_deactivate((WindowPtr)the_event->message);
  230.     break;
  231.  case networkEvt:
  232.  case driverEvt:
  233.  case app1Evt:
  234.  case app2Evt:
  235.  case app3Evt:
  236.  case app4Evt:
  237.      break;
  238.  }
  239. }
  240.  
  241. /*loop till it's time to quit the program processing events*/
  242. void event_loop()
  243. {EventRecord the_event;
  244.  want_done=false;            /*don't want to quit yet*/
  245.  bad_menu();                /*the menus need updating*/
  246.  while (!want_done){        /*loop till we quit*/
  247.    check_paks_in_Q();
  248.    scope_tick();
  249.    SystemTask();            /*keep the background tasks happy*/
  250.    if(!menu_ok)                /*need to fix the menus?*/
  251.     fix_menu();                /*yes, fix them*/
  252.    if(GetNextEvent(everyEvent,&the_event)) /*if have an event set the_event*/
  253.      do_event(&the_event);    /*got an event, process it*/
  254.    }
  255. }
  256.